//
// Created by Martin on 2022/4/15.
//

#include <stdio.h>
#include <vector>

using namespace std;

int Find(vector<int>& fa, int x)
{
    if (x != fa[x]) {
        fa[x] = Find(fa, fa[x]);
    }
    return fa[x];
}

void Union(vector<int>& fa, int x, int y)
{
    int a = Find(fa, x);
    int b = Find(fa, y);
    if (a != b) {
        fa[a] = b;
    }
//    if (a < b) {
//        fa[b] = a;
//    } else if (a > b){
//        fa[a] = b;
//    }
}

// 并查集问题
int main()
{
    int N; // 城镇数量
    int M; // 道路数量

    while (scanf("%d%d", &N, &M) != EOF && N != 0) {
        int m = M, n = N;
        int ans = 0; // 连通分量数量

        vector<int> fa;
        fa.resize(n + 1);
        // 初始化每个节点的集合号为自身
        for (int i = 1; i <= n; ++i) {
            fa[i] = i;
        }

        // 合并
        int x, y;
        for (int i = 0; i < m; ++i) {
            scanf("%d%d", &x, &y);
            Union(fa, x, y); // 合并集合
        }

        for (int i = 1; i <= n; ++i) { // 统计集合数量
            if (fa[i] == i) {
                ans++;
            }
        }
        printf("%d\n", ans - 1); // 输出答案
    }
    return 0;
}